package util;

public class Valida 
{
	public static boolean isCpfValido( String cpf )
	{
		return( !isDigitosCpfTodosIguais(cpf) && isDigitosVerificacaoCpfValidos(cpf) );
	}

	private static boolean isDigitosCpfTodosIguais( String cpf ) 
	{
		int primeiroDigitoCpf = getValorAt( cpf, 0 );
		
		for(int i=1; i < cpf.length(); i++)
		{
			if( getValorAt( cpf, i ) != primeiroDigitoCpf )
				return false;
		}
		return true;
	}
	
	private static boolean isDigitosVerificacaoCpfValidos( String cpf )
	{
		int primeiroDigitoVerificador = getValorAt( cpf, 9 );
		int segundoDigitoVerificador = getValorAt( cpf, 10 );
		
		return ( getValorEsperadoDigitoVerifCPF( cpf, 10 ) == primeiroDigitoVerificador && 
				 getValorEsperadoDigitoVerifCPF( cpf, 11 ) == segundoDigitoVerificador );
	}
	
	//------------------------------------------------------------------------------------------
	private static int getValorEsperadoDigitoVerifCPF( String cpf, final int IND_DIGITO_VERIFICADO )
	{
		final int NUM_DIGITOS_A_VERIFICAR = IND_DIGITO_VERIFICADO - 1;
		int soma = 0;

		for(int i=0; i < NUM_DIGITOS_A_VERIFICAR; i++)
		{
			int valorDoDigito = getValorAt( cpf, i );
			int pesoDoDigito = IND_DIGITO_VERIFICADO - i;
			soma += valorDoDigito * pesoDoDigito;
		}
		
		int resto = soma % 11;
		
		if (resto == 0 || resto == 1) 
			return 0;
		else 
			return 11 - resto;
	}
	
	private static int getValorAt( String str, int index )
	{
		return Integer.valueOf( str.substring( index, index+1 ) );
	}	
}
